home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-07-26 | 7.5 KB | 265 lines | [TEXT/PJMM] |
- {Preferences file handling}
-
- {Principle: If we can write in the app itself, we do, but if not, or if there is already}
- {a prefs file, we use a pref file in the system folder. (The idea is that it is very elegant}
- {to save prefs in the application, whenever that is allowable.)}
-
- {New version (march -94), stand-alone, takes file name and type as parameters,}
- {can be forced to create a pref file, includes resource copying routine.}
-
- {What can we improve? Removing the last globals?}
- {Kolla "shared"-flagga och sätta alwaysExternal efter den? (Bra idé!) Kan man kolla om}
- {file sharing är på?}
-
- unit Preferences;
-
- {Made with help from the sources of}
- {DeHQX v2.0.0 © Peter Lewis, Aug 1991 }
- {Many thanks to Peter for sharing his sources with us!}
-
- interface
-
- var
- gAppFile, gPrefFile: integer; {refnumbers to pass to UseResFile.}
- sysenv: SysEnvRec;
-
- function SetPrefFile (prefsFileName: Str255; prefCreator, prefType: OSType; alwaysExternal: Boolean): Boolean;
- {Open the pref file if needed. Set the global variables gAppFile and gPrefFile.}
- {If alwaysExternal is true, we always want a pref file in the system folder even if we can save in the application.}
- {Returns true if a new gPrefFile was created.}
-
- {Copy a resource from one file to another. Useful when SetPrefFile returns true!}
- function CopyResource (fromFile, toFile: integer; theResType: ResType; id: integer): OSErr;
-
- implementation
-
- { 1) hitta Preferencefolder}
- { 2) Kolla om prefsfil existerar. I så fall, öppna den och gå till 6. }
- { 3) Hämta resurs och ändra den med ChangeResource. Om det gick, gå till 6.}
- { 4) Skapa prefsfil och öppna den.}
- { 5) Hämta resurser ur programmet och kopiera in i prefsfilen}
- { 6) Hämta resurser och skapa om de inte finns.}
-
- const
- {Följande inte längre hårdkodat!!!}
- {PrefsFileName = 'Hexmap Prefs';}
- {PrefCreator = '»Hex';}
- {PrefType = 'Pref';}
-
- { From Folders:}
- kPreferencesFolderType = 'pref'; {preferences for applications go here}
-
- { From Folders:}
- function FindFolder (vRefNum: INTEGER; folderType: OSType; createFolder: BOOLEAN; var foundVRefNum: INTEGER; var foundDirID: LONGINT): OSErr;
- inline
- $7000, $A823;
-
- function GetBlessed (vRefNum: INTEGER; var blessed: longint; var volID: integer): OSErr;
- var
- myHPB: HParamBlockRec;
- error: OSErr;
- begin
- blessed := 0;
- with myHPB do
- begin
- ioNamePtr := nil;
- ioVRefNum := vRefNum; {get for default volume}
- ioVolIndex := 0; {we’re not making indexed calls}
- error := PBHGetVInfo(@myHPB, FALSE);
- if error = noErr then
- begin
- blessed := ioVFndrInfo[1];
- volID := ioVRefNum;
- end;
- end; {WITH}
- GetBlessed := error;
- end;
-
- function GetDirID (wdrn: integer; var vrn: integer; var dirID: longInt): OSErr;
- var
- procID: longInt;
- oe: OSErr;
- begin
- oe := GetWDInfo(wdrn, vrn, dirID, procID);
- if oe <> noErr then
- begin
- vrn := wdrn;
- dirID := 0;
- end;
- GetDirID := oe;
- end;
-
- function GetPrefsFolder (var ovrn: integer): OSErr;
- var
- vrn: integer;
- sDirID: longint;
- oe: OSErr;
- pb: WDPBRec;
- oDirID: longint; {förr var-deklarerad utvariabel}
- oVolID: integer;{förr var-deklarerad utvariabel}
- begin
- vrn := sysenv.sysVRefNum;
- {ReportStr(stringof('SysEnv: ', sysenv.sysVRefNum));}
- if sysenv.systemVersion >= $0700 then {System7}
- begin
- {oe := GetBlessed(ovrn, oDirID, oVolID);}
- sDirID := 0;
- oe := GetDirID(vrn, vrn, sDirID);
- {ReportStr(stringof('kjsajkd: ', vrn, ' ', sDirID));}
- oe := FindFolder(vrn, kPreferencesFolderType, true, oVolID, oDirID);
- {ReportStr(stringof('FindFolder: ', oVolID, ' ', oDirID));}
- {ovrn := sysenv.sysVRefNum;}
-
- {Konvertera FindFolders volref+dirid till WDref}
- pb.ioVRefNum := oVolID;
- pb.ioWDProcID := longint('ERIK');
- pb.ioWDDirID := oDirID;
- pb.ioWDIndex := 0;
- {pb.ioWDVRefNum := -1; {???}
- pb.ioNamePtr := nil;
- pb.ioCompletion := nil;
- oe := PBOpenWD(@pb, false);
- ovrn := pb.ioVRefNum; {WDRefNum}
- end
- else
- begin
- ovrn := vrn;
- {oe := GetBlessed(ovrn, oDirID, oVolID);}
- oe := NoErr;
- end;
- GetPrefsFolder := oe;
- end;
-
- {function SetPrefFile: boolean;}
- function SetPrefFile (prefsFileName: Str255; prefCreator, prefType: OSType; alwaysExternal: Boolean): Boolean;
- var
- err: OSErr;
- PrefsFolder{, PrefsVolId}
- : integer;
- {PrefsFolderId: longint;}
- h: handle;
- s: str255;
- begin
- gAppFile := CurResFile; {spara programmerts resursfilreferens}
- gPrefFile := 0;
- SetPrefFile := false;
- { 1) hitta Preferencefolder}
- err := GetPrefsFolder(PrefsFolder);{, PrefsFolderId, PrefsVolId}
- if err <> NoErr then
- ;
- {ReportStr('Error finding system folder.')}
-
- { 2) Kolla om prefsfil existerar. I så fall, öppna den och gå till 6. }
- gPrefFile := OpenRFPerm(PrefsFileName, PrefsFolder, FSRdWrPerm);
- if ResError = noErr then
- begin
- {Vi borde kolla pref-fil-versionsnummer!}
- end
- else
- begin
- gPrefFile := 0;
-
- { 3) Hämta resurs och ändra den med ChangeResource. Om det gick, gå till 6.}
- {Om alwaysExternal är true behöver vi inte kolla - då vill vi ha en }
- if alwaysExternal then
- begin
- h := Get1Resource(prefCreator, 0); {Programmets signatur finns alltid om den har en BNDL.}
- if h = nil then
- begin
- {Error! Resursen saknas!}
- {ReportStr('Resource missing!');}
- end;
- ChangedResource(h);
- alwaysExternal := ResError <> noErr; {Lite fult att ändra "always", men nu vill vi ju ha extern!}
- ReleaseResource(h); {OK, vi är klara med resursen}
- end;
-
- if alwaysExternal then
- begin
- { 4) Skapa prefsfil och öppna den.}
- err := Create(PrefsFileName, PrefsFolder, PrefCreator, PrefType);
- if err = noErr then
- begin
- ;
- {ReportStr('Application locked. Creating prefs file instead.')}
-
- HCreateResFile(PrefsFolder, 0, PrefsFileName);{???}
- if ResError <> noErr then
- begin
- {ReportStr('Couldn''t create resource fork!');}
- end
- else
- gPrefFile := OpenRFPerm(PrefsFileName, PrefsFolder, FSRdWrPerm);
-
- if ResError = noErr then
- SetPrefFile := true; {new pref file!}
- { 5) Hämta resurser ur programmet och kopiera in i prefsfilen}
- end{Create lyckades}
- else
- {ReportStr('Failed to create prefsfile!')}
- ;
- end; {Programmet skrivskyddat.}
- end; {prefsfil existerade inte}
- { 6) Hämta resurser och skapa om de inte finns.}
- end;
-
-
- {Kopiera resurs:}
- function CopyResource (fromFile, toFile: integer; theResType: ResType; id: integer): OSErr;
- var
- oldResFile: integer;
- res, rescopy: Handle;
- wasLoaded: Boolean;
- theID: integer;
- theType: ResType;
- theName: Str255;
- procedure Barf;
- begin
- CopyResource := ResError;
- UseResFile(oldResFile); {återställ}
- exit(CopyResource);
- end;
- procedure CheckError;
- begin
- if ResError <> noErr then
- Barf;
- end; {CheckError}
- begin
- oldResFile := CurResFile;
- UseResFile(fromFile);
- CheckError;
-
- SetResLoad(false);
- res := Get1Resource(theResType, id);
- {Don't CheckError before doing SetResLoad(true)!!!}
- SetResLoad(true);
- CheckError;
- if res <> nil then
- begin
- wasLoaded := res^ = nil;
- LoadResource(res);
- CheckError;
- UseResFile(toFile);
- CheckError;
- GetResInfo(res, theID, theType, theName);
- CheckError;
- rescopy := res;
- if HandToHand(rescopy) <> noErr then
- Barf; {i stället för DetachResource(res);}
- CheckError;
- AddResource(rescopy, theResType, id, theName);
- CheckError;
- ReleaseResource(rescopy);
- if not wasLoaded then
- ReleaseResource(res); {If it wasn't loaded before, it shouldn't be afterwards.}
- CheckError;
- CopyResource := noErr;
- end
- else
- begin
- CopyResource := resNotFound;
- end;
- UseResFile(oldResFile);
- end;
-
- end.